#ifndef __FTP_H__
#define __FTP_H__
struct ftpurlinfo{
    char *buffer;  //缓存区
    char *user;    //用户名
    char *pw;      //用户密码
    char *host;    //服务器地址
    char *path;    //文件路径
    int port;      //端口号
} ;

typedef int (*txcallback)(void *arg, void *buf, size_t size);
typedef int (*rxcallback)(void *arg, const void *buf, size_t size);

/**
 * @brief 从指定url下载文件
 * 
 * @param url 服务器地址，格式: ftp://test:test@192.168.0.1:21/test/v01.ota
 * @param ofile 保存文件
 * @return int 0-成功
 */
int ftp_get(const char *url, const char *ofile);

/**
 * @brief 上传文件到指定url
 * 
 * @param url 服务器地址，格式: ftp://test:test@192.168.0.1:21/test/v01.ota
 * @param sfile 本地文件
 * @return int 0-成功
 */
int ftp_put(const char *url, const char *sfile);

/**
 * @brief 从url获取ftpurlinfo信息
 * 
 * url格式：ftp://user:password@hostname:port/path/filename
 
 * @param url 
 * @param res 
 * @return int 
 */
int get_ftpurlinfo(const char *url, struct ftpurlinfo *res);

/**
 * @brief 释放ftpurlinfo资源，用了get_ftpurlinfo需要用此函数释放资源
 * 
 * @param res 
 */
void free_ftpurlinfo(struct ftpurlinfo *res);

/**
 * @brief 上传文件到服务器
 * 
 * @param c_sock socket
 * @param d 服务器文件路径
 * @param stor_size 返回上传文件大小
 * @param stop 是否停止传送
 * @param cb 上传数据回调函数
 * @param arg 回调函数参数
 * @return int 返回值，0-成功，其它失败
 */
int ftp_stor( int c_sock, const char *d ,unsigned int *stor_size, int *stop, txcallback cb, void *arg);

/**
 * @brief 从服务器下载文件
 * 
 * @param c_sock socket
 * @param s 服务器文件路径
 * @param stor_size 返回下载文件大小
 * @param stop 是否停止接收
 * @param cb 下载数据回调函数
 * @param arg 回调函数参数
 * @return int 返回值，0-成功，其它失败
 */
int ftp_retr( int c_sock, const char *s, unsigned int *stor_size, int *stop, rxcallback cb, void *arg);

/**
 * @brief 连接ftp服务器
 * 
 * @param host 服务器地址
 * @param port 服务器端口
 * @param user 用户名
 * @param pwd 密码
 * @return int <=0, 失败；>0 ftp连接socket句柄
 */
int ftp_connect(const char *host, int port, const char *user, const char *pwd );

/**
 * @brief 断开ftp服务器连接
 * 
 * @param c_sock socket句柄
 * @return int 
 */
int ftp_quit( int c_sock);
#endif